home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / demo / intro / 3D-Boing.lha / 3d-boing / 3D-Boing.s < prev    next >
Text File  |  2002-08-20  |  19KB  |  1,014 lines

  1.         opt    d+
  2.  
  3.         include    my_begin.s
  4.         include    intuition/intuition.i
  5.         include    graphics/rastport.i
  6.         include    graphics/view.i
  7.         include    "devices/audio.i"
  8.  
  9. Sin6:        =    $D61304E        ;Sin(6)*65536*32768
  10. Cos6:        =    $7F4C7E54        ;Cos(6)*65536*32768
  11. Sin45:        =    $5A82799A        ;Sin(45)*65536*32768
  12. Cos45:        =    Sin45
  13.  
  14. WaitTime:    =    24
  15.  
  16. TriangleNumber:    =    8
  17.  
  18. BeginIO:        =    -30
  19.  
  20. ;Ñìåùåíèÿ ïåðåìåííûõ
  21. X1:        =    0
  22. Y1:        =    4
  23. Z1:        =    8
  24. X2:        =    12
  25. Y2:        =    16
  26. Z2:        =    20
  27. X3:        =    24
  28. Y3:        =    28
  29. Z3:        =    32
  30.  
  31. Sy1:        =    0
  32. Sx1:        =    2
  33. Sy2:        =    4
  34. Sx2:        =    6
  35. Sy3:        =    8
  36. Sx3:        =    10
  37. dX1:        =    12
  38. dY1:        =    14
  39. dZ1:        =    16
  40. dX2:        =    18
  41. dY2:        =    20
  42. dZ2:        =    22
  43. nX:        =    24
  44. nY:        =    26
  45. nZ:        =    28
  46. X1c:        =    30
  47. Y1c:        =    32
  48. Z1c:        =    34
  49. X2c:        =    36
  50. Y2c:        =    38
  51. Z2c:        =    40
  52. X3c:        =    42
  53. Y3c:        =    44
  54. Z3c:        =    46
  55.  
  56.  
  57. Start:
  58. ;        CALLEXE    Forbid
  59.         moveq    #40,d0            ;Îòêðûòèå graphics.library
  60.         lea    GfxName(pc),a1
  61.         CALLEXE    OpenLibrary
  62.         move.l    d0,GfxBase
  63.         beq    Exit0
  64.  
  65.         moveq    #0,d0            ;Îòêðûòèå intuition.library
  66.         lea    IntName(pc),a1
  67.         CALLEXE    OpenLibrary
  68.         move.l    d0,IntBase
  69.         beq    Exit1
  70.  
  71.         sub.l    a0,a0
  72.         lea    ScreenDefs(pc),a1
  73.         CALLINT OpenScreenTagList
  74.         move.l    d0,ScreenHd
  75.         beq    Exit2
  76.  
  77.         sub.l    a0,a0
  78.         lea    WindowDefs(pc),a1
  79.         CALLINT OpenWindowTagList
  80.         move.l    d0,WindowHd
  81.         beq    Exit3
  82.  
  83.         move.l    d0,a0
  84.         lea    PointerData,a1        ;ñïðàéò óêàçàòåëÿ ìûøè
  85.         moveq    #1,d0            ;âûñîòà
  86.         moveq    #16,d1            ;øèðèíà
  87.         moveq    #0,d2            ;ñìåùåíèå ïî X
  88.         moveq    #0,d3            ;ñìåùåíèå ïî Y
  89.         CALLINT    SetPointer        ;ãàñèì óêàçàòåëü ìûøè
  90.         move.l    WindowHd,a0
  91.         move.l    wd_RPort(a0),RstPort
  92.         CALLINT    ViewPortAddress
  93.         move.l    d0,a0
  94. PalGen:
  95.         lea    MyPalette,a1
  96.         lea    4(a1),a2
  97.         moveq    #7,d1            ;d1=$07000000
  98.         ror.l    #8,d1
  99.         moveq    #0,d2            ;d2=$00000000
  100.         moveq    #1,d3
  101.         ror.l    #8,d3            ;d3=$01000000
  102.         move.l    d3,(a1)
  103.         lsl.l    #3,d3            ;d3=$08000000
  104.  
  105.         moveq    #30,d0
  106.         move.l    d2,(a2)+
  107.         move.l    d2,(a2)+
  108.         move.l    d2,(a2)+
  109.         move.l    d1,d4
  110. PalGen0:
  111.         move.l    d4,(a2)+        ;32 îòòåíêà áåëîãî (0 - 31)
  112.         move.l    d4,(a2)+
  113.         move.l    d4,(a2)+
  114.         add.l    d3,d4
  115.         dbra    d0,PalGen0
  116.  
  117.         moveq    #30,d0
  118.         move.l    d2,(a2)+
  119.         move.l    d2,(a2)+
  120.         move.l    d2,(a2)+
  121.         move.l    d1,d4
  122. PalGen1:
  123.         move.l    d4,(a2)+        ;32 îòòåíêà êðàñíîãî (32 - 63)
  124.         move.l    d2,(a2)+
  125.         move.l    d2,(a2)+
  126.         add.l    d3,d4
  127.         dbra    d0,PalGen1
  128.  
  129.         lsr.l    #1,d1            ;d1=$03800000
  130.         lsr.l    #1,d3            ;d3=$04000000
  131.         moveq    #62,d0
  132.         moveq    #0,d5
  133.         sub.l    d3,d5
  134.         move.l    d2,(a2)+
  135.         move.l    d2,(a2)+
  136.         move.l    d5,(a2)+
  137.         move.l    d1,d4
  138. PalGen2:
  139.         sub.l    d3,d5            ;64 îòòåíêà çåëåíî-ñèíåãî (64 - 127)
  140.         move.l    d2,(a2)+
  141.         move.l    d4,(a2)+
  142.         move.l    d5,(a2)+
  143.         add.l    d3,d4
  144.         dbra    d0,PalGen2
  145.  
  146.         moveq    #62,d0
  147.         sub.l    d3,d5
  148.         move.l    d2,(a2)+
  149.         move.l    d5,(a2)+
  150.         move.l    d2,(a2)+
  151.         move.l    d1,d4
  152. PalGen3:
  153.         sub.l    d3,d5            ;64 îòòåíêà êðàñíî-çåëåíîãî (128 - 191)
  154.         move.l    d4,(a2)+
  155.         move.l    d5,(a2)+
  156.         move.l    d2,(a2)+
  157.         add.l    d3,d4
  158.         dbra    d0,PalGen3
  159.  
  160.         moveq    #62,d0
  161.         sub.l    d3,d5
  162.         move.l    d5,(a2)+
  163.         move.l    d2,(a2)+
  164.         move.l    d2,(a2)+
  165.         move.l    d1,d4
  166. PalGen4:
  167.         sub.l    d3,d5            ;64 îòòåíêà  cèíå-êðàñíîãî (192 - 255)
  168.         move.l    d5,(a2)+
  169.         move.l    d2,(a2)+
  170.         move.l    d4,(a2)+
  171.         add.l    d3,d4
  172.         dbra    d0,PalGen4
  173.  
  174.         CALLGFX LoadRGB32
  175.  
  176.         bsr    C2P
  177.  
  178. CoordsGen:
  179.         lea    Coords,a0
  180.         lea    Colours,a1
  181.         lea    Data2(pc),a2
  182.         lea    Data3(pc),a3
  183.         moveq    #TriangleNumber-1,d7
  184. CoordsGen4:
  185.         moveq    #8,d6
  186. CoordsGen5:
  187.         move.w    (a2)+,(a0)+
  188.         addq.l    #2,a0
  189.         dbra    d6,CoordsGen5
  190.         move.b    (a3)+,(a1)+
  191.         dbra    d7,CoordsGen4
  192.  
  193.         moveq    #7,d7
  194. CoordsGen0:
  195.         lea    Data0(pc),a2
  196.         lea    Data1(pc),a3
  197.         moveq    #27,d6
  198. CoordsGen1:
  199.         moveq    #8,d5
  200. CoordsGen2:
  201.         move.l    (a2)+,(a0)+
  202.         dbra.w    d5,CoordsGen2
  203.         move.b    (a3)+,(a1)+
  204.         dbra    d6,CoordsGen1
  205.         lea    Data0(pc),a2
  206.         move.l    #Sin45,d0        ;ïîâîðîò ñåêòîðà
  207.         move.l    #Cos45,d1
  208.         move.w    #3*28-1,d6
  209. CoordsGen3:
  210.         bsr    TurnPoint
  211.         addq.l    #6,a2
  212.         addq.l    #6,a2
  213.         dbra    d6,CoordsGen3
  214.         
  215.         dbra    d7,CoordsGen0
  216.  
  217.         moveq    #0,d0
  218.         moveq    #0,d1
  219.         move.w    #319,d2
  220.         move.w    #199,d3
  221.         lea    Plasma,a0        ;ñîçäàåì ïëàçìó
  222.         bsr    PlasmaGen
  223.         lea    Buffer,a1
  224.         move.w    #200*80-1,d0
  225. Plasma0:
  226.         add.l    #$40404040,(a0)+
  227.         dbra    d0,Plasma0
  228.  
  229.         CALLEXE    CreateMsgPort
  230.         move.l    d0,MsgPort
  231.         beq    Exit4
  232.         move.l    d0,a0
  233.         moveq.l    #ioa_SIZEOF,d0
  234.         CALLEXE    CreateIORequest
  235.         move.l    d0,IORequest
  236.         beq    Exit5
  237.         move.l    d0,a1
  238.         moveq    #0,d0
  239.         moveq    #0,d1
  240.         lea    DeviceName(pc),a0
  241.         move.w    d0,ioa_AllocKey(a1)
  242.         move.l    #AChanels,ioa_Data(a1)
  243.         moveq    #1,d7
  244.         move.l    d7,ioa_Length(a1)
  245.         CALLEXE    OpenDevice        ;îòêðûâàåì audio.device
  246.         bne    Exit6
  247. Title:
  248.         moveq    #31,d7
  249. Title0:
  250.         lea    Buffer,a0
  251.         lea    GfxData,a1
  252.         lea    Plasma,a2
  253.         moveq    #10,d0
  254. Title1:
  255.         moveq    #0,d1
  256. Title2:
  257.         move.l    d0,d2
  258.         divu.w    #10,d2
  259.         move.l    d1,d3
  260.         divu.w    #10,d3
  261.         move.l    -4(a1,d2.w*4),d2
  262.         btst    d3,d2
  263.         beq.s    Title4
  264.         move.l    d0,d2
  265.         mulu.w    #320,d2
  266.         add.l    d1,d2
  267.         move.b    (a0,d2.l),d3
  268.         bne.s    Title3
  269.         moveq    #$40,d3
  270. Title3:
  271.         cmp.b    (a2,d2.l),d3
  272.         bcc.s    Title4
  273.         addq.b    #6,d3
  274.         move.b    d3,(a0,d2.l)
  275. Title4:
  276.         addq.l    #1,d1
  277.         cmp.w    #320,d1
  278.         bcs.s    Title2
  279.         addq.l    #1,d0
  280.         cmp.w    #190,d0
  281.         bcs.s    Title1
  282.         CALLGFX    WaitTOF
  283.         bsr    C2P
  284.         dbra    d7,Title0        
  285.  
  286.         moveq    #127,d7
  287. Wait:
  288.         CALLGFX    WaitTOF
  289.         dbra    d7,Wait
  290.  
  291.         bsr    Sound
  292.  
  293.         move.w    #2999,d7
  294.         lea    SinCosTable,a5
  295. IntroLoop:
  296.         move.l    WindowHd,a0
  297.         move.l    wd_UserPort(a0),a0
  298.         CALLEXE    GetMsg
  299.         tst.l    d0
  300.         bne    Exit
  301.  
  302.         lea    Buffer,a0        ;ôîí
  303.         lea    Plasma,a1
  304.         move.w    #200*80-1,d6
  305. Background:
  306.         move.l    (a1)+,(a0)+
  307.         dbra    d6,Background
  308.  
  309.         lea    MyVars,a0
  310.         lea    Coords,a2
  311.         lea    Colours,a6
  312. Walls:
  313.         moveq    #TriangleNumber-1,d6
  314. Walls0:
  315.         bsr    CameraTurn        ;ñìåùåíèå êàìåðû
  316.         bsr    TriangleWalls        ;îòîáðàæåíèå ïîëèãîíà
  317.         add.l    #36,a2
  318.         addq.l    #1,a6
  319.         dbra    d6,Walls0
  320. Sphere:
  321.         move.w    #223,d6
  322. IntroLoop0:
  323.         bsr    CameraTurn        ;ñìåùåíèå êàìåðû
  324.  
  325.         move.w    (a5),d4            ;ïîâîðîò âåêòîðà ñìåùåíèÿ
  326.         move.w    2(a5),d5
  327.         move.w    dY(pc),d1
  328.         muls.w    d4,d1            ;d1=dY*Sim(alfa)/2
  329.         move.w    dZ(pc),d2
  330.         muls.w    d5,d2            ;d2=dZ*Cos(alfa)/2
  331.         sub.l    d1,d2
  332.         add.l    d2,d2
  333.         swap.w    d2            ;dZ'=2*(d2-d1)
  334.         move.w    dY(pc),d0
  335.         muls.w    d5,d0            ;d0=dY*Cos(alfa)/2
  336.         move.w    dZ(Pc),d1
  337.         muls.w    d4,d1            ;d1=dZ*Sin(alfa)/2
  338.         add.l    d0,d1
  339.         add.l    d1,d1
  340.         swap.w    d1            ;dY'=2*(d1+d0)
  341.         move.w    dX(pc),d0        ;ñìåùåíèå ïîëèãîíà
  342.         add.w    d0,X1c(a0)        ;X1c=X1c+dX
  343.         add.w    d0,X2c(a0)        ;X2c=X2c+dX
  344.         add.w    d0,X3c(a0)        ;X3c=X3c+dX
  345.         add.w    d1,Y1c(a0)        ;Y1c=Y1c+dY
  346.         add.w    d1,Y2c(a0)        ;Y2c=Y2c+dY
  347.         add.w    d1,Y3c(a0)        ;Y3c=Y3c+dY
  348.         add.w    d2,Z1c(a0)        ;Z1c=Z1c+dZ
  349.         add.w    d2,Z2c(a0)        ;Z2c=Z2c+dZ
  350.         add.w    d2,Z3c(a0)        ;Z3c=Z3c+dZ
  351.  
  352.         bsr    TriangleSphere        ;îòîáðàæåíèå ïîëèãîíà
  353.  
  354.         move.l    #Sin6,d0        ;ïîâîðîò ïîëèãîíà
  355.         move.l    #Cos6,d1
  356.         moveq    #2,d5
  357. IntroLoop1:
  358.         bsr    TurnPoint
  359.         addq.l    #6,a2
  360.         addq.l    #6,a2
  361.         dbra    d5,IntroLoop1
  362.         addq.l    #1,a6
  363.         dbra    d6,IntroLoop0
  364. CalcCoords:
  365.         lea    dX(pc),a0
  366.         move.w    (a0),d0
  367.         add.w    6(a0),d0        ;dX=dX+ddX
  368.         cmp.w    #80,d0
  369.         bpl.s    CalcCoords0
  370.         cmp.w    #-80,d0
  371.         bpl.s    CalcCoords1
  372. CalcCoords0:
  373.         neg.w    6(a0)            ;ddX=-ddX
  374.         move.w    (a0),d0
  375.         add.w    6(a0),d0
  376.         add.w    6(a0),d0
  377.         bsr    Sound
  378. CalcCoords1:
  379.         move.w    d0,(a0)
  380.         move.w    2(a0),d0
  381.         add.w    8(a0),d0        ;dY=dY+ddY
  382.         cmp.w    #16,d0
  383.         bpl.s    CalcCoords2
  384.         cmp.w    #-16,d0
  385.         bpl.s    CalcCoords3
  386. CalcCoords2:
  387.         neg.w    8(a0)            ;ddY=-ddY
  388.         move.w    2(a0),d0
  389.         add.w    8(a0),d0
  390.         add.w    8(a0),d0
  391.         bsr    Sound
  392. CalcCoords3:
  393.         move.w    d0,2(a0)
  394.         move.w    4(a0),d0
  395.         add.w    10(a0),d0        ;dZ=dZ+ddZ
  396.         cmp.w    #240,d0
  397.         bpl.s    CalcCoords4
  398.         cmp.w    #16,d0
  399.         bpl.s    CalcCoords5
  400. CalcCoords4:
  401.         neg.w    10(a0)            ;ddZ=-ddZ
  402.         move.w    4(a0),d0
  403.         add.w    10(a0),d0
  404.         add.w    10(a0),d0
  405.         bsr    Sound
  406. CalcCoords5:
  407.         move.w    d0,4(a0)
  408.  
  409.         CALLGFX    WaitTOF
  410.         bsr    C2P
  411.  
  412.         add.w    SinCosOffset,a5
  413.         cmp.w    #$8000,(a5)
  414.         bne.s    Offset
  415.         neg.w    SinCosOffset
  416.         add.w    SinCosOffset,a5
  417. Offset:
  418.         dbra    d7,IntroLoop
  419. Exit:
  420.         move.l    IORequest,a1
  421.         CALLEXE    CloseDevice
  422. Exit6:
  423.         move.l    IORequest,a0
  424.         CALLEXE    DeleteIORequest
  425. Exit5:
  426.         move.l    MsgPort,a0
  427.         CALLEXE    DeleteMsgPort
  428. Exit4:
  429.         move.l    WindowHd,a0
  430.         CALLINT CloseWindow
  431. Exit3:
  432.         move.l    ScreenHd,a0
  433.         CALLINT    CloseScreen
  434. Exit2:
  435.         move.l    IntBase,a1
  436.         CALLEXE    CloseLibrary
  437. Exit1:
  438.         move.l    GfxBase,a1
  439.         CALLEXE    CloseLibrary
  440. Exit0:
  441. ;        CALLEXE    Permit
  442.         rts
  443. C2P:
  444.         move.l    RstPort,a0
  445.         moveq    #0,d0
  446.         moveq    #0,d1
  447.         move.l    #320,d2
  448.         move.l    #200,d3
  449.         move.l    d2,d4
  450.         lea    Buffer,a2
  451.         move.l    GfxBase,a6
  452.         jmp    _LVOWriteChunkyPixels(a6)
  453. Sound:
  454.         lea    $dff000,a1
  455.         move.w    #3,$96(a1)        ;âûêëþ÷àåì êàíàëû 1 è 2
  456.         bsr    SoundWait
  457.         move.l    #Sample,d1
  458.         move.l    d1,$a0(a1)
  459.         move.l    d1,$b0(a1)
  460.         move.w    #SLength/2,d1
  461.         move.w    d1,$a4(a1)
  462.         move.w    d1,$b4(a1)
  463.         move.w    #3424,d1
  464.         move.w    d1,$a6(a1)
  465.         move.w    d1,$b6(a1)
  466.         moveq    #64,d1
  467.         move.w    d1,$a8(a1)
  468.         move.w    d1,$b8(a1)
  469.         move.w    #$8203,$96(a1)        ;âêëþ÷àåì êàíàëû 1 è 2
  470.         bsr    SoundWait
  471.         move.l    #PointerData+4,d1
  472.         move.l    d1,$a0(a1)
  473.         move.l    d1,$b0(a1)
  474.         moveq    #1,d1
  475.         move.w    d1,$a4(a1)
  476.         move.w    d1,$b4(a1)
  477.         rts
  478. SoundWait:
  479.         move.b    6(a1),d1
  480.         moveq    #WaitTime,d3
  481. SoundWait0:
  482.         move.b    6(a1),d2
  483.         cmp.b    d2,d1
  484.         beq.s    SoundWait0
  485.         move.b    d2,d1
  486.         dbra    d3,SoundWait0
  487.         rts
  488. PlasmaGen:
  489. ;d0=X1
  490. ;d1=Y1
  491. ;d2=X2
  492. ;d3=Y2
  493. ;d5 - êîä öâåòà äëÿ óãëîâûõ òî÷åê
  494. ;(a0) - óêàçàòåëü íà áóôåð ïëàçìû
  495.         move.w    d2,d4
  496.         sub.w    d0,d4
  497.         subq.w    #2,d4
  498.         bcc.s    PlasmaGen0        ;X2-X1<2?
  499.         move.w    d3,d4
  500.         sub.w    d1,d4
  501.         subq.w    #2,d4
  502.         bcs    EndPlasmaGen        ;Y2-Y1<2?
  503. PlasmaGen0:
  504.         move.w    d0,d4
  505.         add.w    d2,d4
  506.         lsr.w    #1,d4            ;Xm=(X1+X2)/2
  507.         move.w    d1,d5
  508.         add.w    d3,d5
  509.         lsr.w    #1,d5            ;Ym=(Y1+Y2)/2
  510.  
  511.         move.w    d4,d6            ;Xm
  512.         move.w    d1,d7            ;Y1
  513.         bsr    GetPixel
  514.         bne.s    PlasmaGen1
  515.         move.w    d1,d7
  516.         bsr    WritePixel
  517. PlasmaGen1:
  518.         move.w    d0,d6            ;X1
  519.         move.w    d5,d7            ;Ym
  520.         bsr    GetPixel
  521.         bne.s    PlasmaGen2
  522.         move.w    d5,d7
  523.         bsr    WritePixel
  524. PlasmaGen2:
  525.         move.w    d2,d6            ;X2
  526.         move.w    d5,d7            ;Ym
  527.         bsr    GetPixel
  528.         bne.s    PlasmaGen3
  529.         move.w    d5,d7
  530.         bsr    WritePixel
  531. PlasmaGen3:
  532.         move.w    d4,d6            ;Xm
  533.         move.w    d3,d7            ;Y2
  534.         bsr    GetPixel
  535.         bne.s    PlasmaGen4
  536.         move.w    d3,d7
  537.         bsr    WritePixel
  538. PlasmaGen4:
  539.         move.w    d4,d6            ;Xm
  540.         move.w    d5,d7            ;Ym
  541.         bsr    WritePixel
  542.  
  543.         movem.l    d0-d5,-(sp)
  544.         move.w    d4,d2
  545.         move.w    d5,d3
  546.         bsr    PlasmaGen        ;X1,Y1,Xm,Ym
  547.         movem.l    (sp)+,d0-d5
  548.  
  549.         movem.l    d0-d5,-(sp)
  550.         move.w    d4,d0
  551.         move.w    d5,d3
  552.         bsr    PlasmaGen        ;Xm,Y1,X2,Ym
  553.         movem.l    (sp)+,d0-d5
  554.  
  555.         movem.l    d0-d5,-(sp)
  556.         move.w    d4,d2
  557.         move.w    d5,d1
  558.         bsr    PlasmaGen        ;X1,Ym,Xm,Y2
  559.         movem.l    (sp)+,d0-d5
  560.  
  561.         movem.l    d0-d5,-(sp)
  562.         move.w    d4,d0
  563.         move.w    d5,d1
  564.         bsr    PlasmaGen        ;Xm,Ym,X2,Y2
  565.         movem.l    (sp)+,d0-d5
  566. EndPlasmaGen:
  567.         rts
  568. GetPixel:
  569. ;d6=X
  570. ;d7=Y
  571. ;(a0) - óêàçàòåëü íà áóôåð ïëàçìû
  572.         move.l    a0,a1
  573.         mulu.w    #320,d7
  574.         add.l    d7,a1
  575.         add.w    d6,a1
  576.         moveq    #0,d7
  577.         move.b    (a1),d7
  578.         rts
  579. WritePixel:
  580. ;d0=X1
  581. ;d1=Y1
  582. ;d2=X2
  583. ;d3=Y2
  584. ;d6=X
  585. ;d7=Y
  586. ;(a0) - óêàçàòåëü íà áóôåð ïëàçìû
  587.         movem.l    d2-d7,-(sp)
  588.         move.w    d6,a2
  589.         move.w    d7,a3
  590.  
  591.         move.w    d3,d4
  592.         sub.w    d1,d4
  593.         move.w    d2,d5
  594.         sub.w    d0,d5
  595.         add.w    d5,d4            ;d4=Y2-Y1+X2-X1
  596.  
  597.         move.w    d0,d6
  598.         move.w    d1,d7
  599.         bsr    GetPixel        ;X1,Y1
  600.         move.w    d7,d5
  601.         move.w    d3,d7
  602.         bsr    GetPixel        ;X1,Y2
  603.         add.w    d7,d5
  604.         move.w    d2,d6
  605.         move.w    d3,d7
  606.         bsr    GetPixel        ;X2,Y2
  607.         add.w    d7,d5
  608.         move.w    d1,d7
  609.         bsr    GetPixel        ;X2,Y1
  610.         add.w    d7,d5            ;d5=Color(X1,Y1)+Color(X2,Y1)+
  611.                         ;+Color(X2,Y2)+Color(X1,Y2)
  612.         move.w    Random(pc),d6
  613.         mulu.w    #31421,d6
  614.         add.w    #6927,d6
  615.         move.w    d6,Random        ;ïñåâäîñëó÷àéíàÿ âåëè÷èíà
  616.         bmi.s    WritePixel0        ;Random=Random*31421+6927
  617.         sub.w    d4,d5
  618.         bra.s    WritePixel1
  619. WritePixel0:
  620.         add.w    d4,d5
  621. WritePixel1:
  622.         lsr.w    #2,d5            ;d5=(d5+sgn(Random)*d4)/4
  623.         cmp.w    #192,d5
  624.         bcs.s    WritePixel3
  625.         move.w    #191,d5
  626. WritePixel3:
  627.         move.l    a0,a1
  628.         move.w    a3,d7
  629.         mulu.w    #320,d7
  630.         add.l    d7,a1
  631.         add.l    a2,a1
  632.         move.b    d5,(a1)
  633.         movem.l    (sp)+,d2-d7
  634.         rts
  635. TurnPoint:
  636. ;d0=Sin(alfa)
  637. ;d1=Cos(alfa)
  638. ;(a2) - óêàçàòåëü íà ñòðóêòóðó ñ êîîðäèíàòàìè âåðøèí è êîäîì öâåòà
  639.         move.l    X1(a2),d2
  640.         moveq    #0,d3
  641.         muls.l    d1,d3:d2        ;d3=X*cos(alfa)/2
  642.         move.l    Z1(a2),d4
  643.         moveq    #0,d2
  644.         muls.l    d0,d2:d4        ;d2=Z*sin(alfa)/2
  645.         sub.l    d2,d3
  646.         add.l    d3,d3            ;X'=2*(d3-d2)
  647.         move.l    d3,a3
  648.  
  649.         move.l    X1(a2),d2
  650.         moveq    #0,d3
  651.         muls.l    d0,d3:d2        ;d3=X*sin(alfa)/2
  652.         move.l    Z1(a2),d4
  653.         moveq    #0,d2
  654.         muls.l    d1,d2:d4        ;d2=Z*cos(alfa)/2
  655.         add.l    d3,d2
  656.         add.l    d2,d2            ;Z'=2*(d3+d2)
  657.         move.l    d2,Z1(a2)
  658.         move.l    a3,X1(a2)
  659.         rts
  660. CameraTurn:
  661. ;(a0) - óêàçàòåëü íà îáëàñòü õðàíåíèÿ ïåðåìåííûõ
  662. ;(a2) - óêàçàòåëü íà ñòðóêòóðó ñ êîîðäèíàòàìè âåðøèí è êîäîì öâåòà
  663. ;Dist=256
  664.         move.w    (a5),d0            ;ïîâîðîò êàìåðû
  665.         move.w    2(a5),d1
  666.         move.w    Y1(a2),d2
  667.         muls.w    d0,d2            ;d2=Y1*Sim(alfa)/2
  668.         move.w    Z1(a2),d3
  669.         muls.w    d1,d3            ;d3=Z1*Cos(alfa)/2
  670.         sub.l    d2,d3
  671.         add.l    d3,d3
  672.         swap.w    d3
  673.         move.w    d3,Z1c(a0)        ;Z1c=2*(d3-d2)
  674.         move.w    Y1(a2),d2
  675.         muls.w    d1,d2            ;d2=Y1*Cos(alfa)/2
  676.         move.w    Z1(a2),d3
  677.         muls.w    d0,d3            ;d3=Z1*Sin(alfa)/2
  678.         add.l    d2,d3
  679.         add.l    d3,d3
  680.         swap.w    d3
  681.         move.w    d3,Y1c(a0)        ;Y1c=2*(d3+d2)
  682.         move.w    Y2(a2),d2
  683.         muls.w    d0,d2            ;d2=Y2*Sim(alfa)/2
  684.         move.w    Z2(a2),d3
  685.         muls.w    d1,d3            ;d3=Z2*Cos(alfa)/2
  686.         sub.l    d2,d3
  687.         add.l    d3,d3
  688.         swap.w    d3
  689.         move.w    d3,Z2c(a0)        ;Z2c=2*(d3-d2)
  690.         move.w    Y2(a2),d2
  691.         muls.w    d1,d2            ;d2=Y2*Cos(alfa)/2
  692.         move.w    Z2(a2),d3
  693.         muls.w    d0,d3            ;d3=Z2*Sin(alfa)/2
  694.         add.l    d2,d3
  695.         add.l    d3,d3
  696.         swap.w    d3
  697.         move.w    d3,Y2c(a0)        ;Y2c=2*(d3+d3)
  698.         move.w    Y3(a2),d2
  699.         muls.w    d0,d2            ;d2=Y3*Sim(alfa)/2
  700.         move.w    Z3(a2),d3
  701.         muls.w    d1,d3            ;d3=Z3*Cos(alfa)/2
  702.         sub.l    d2,d3
  703.         add.l    d3,d3
  704.         swap.w    d3
  705.         move.w    d3,Z3c(a0)        ;Z3c=2*(d3-d2)
  706.         move.w    Y3(a2),d2
  707.         muls.w    d1,d2            ;d2=Y3*Cos(alfa)/2
  708.         move.w    Z3(a2),d3
  709.         muls.w    d0,d3            ;d3=Z3*Sin(alfa)/2
  710.         add.l    d2,d3
  711.         add.l    d3,d3
  712.         swap.w    d3
  713.         move.w    d3,Y3c(a0)        ;Y3c=2*(d3+d3)
  714.         move.w    X1(a2),X1c(a0)        ;X1c=X1
  715.         move.w    X2(a2),X2c(a0)        ;X2c=X2
  716.         move.w    X3(a2),X3c(a0)        ;X3c=X3
  717.         rts
  718. TriangleSphere:        
  719. ;(a0) - óêàçàòåëü íà îáëàñòü õðàíåíèÿ ïåðåìåííûõ
  720. ;(a2) - óêàçàòåëü íà ñòðóêòóðó ñ êîîðäèíàòàìè âåðøèí è êîäîì öâåòà
  721. ;Dist=256
  722.         move.w    X2c(a0),d0        ;ïðîâåðÿåì âèäèìîñòü
  723.         sub.w    X1c(a0),d0
  724.         move.w    d0,dX1(a0)        ;dX1=X2c-X1c
  725.         move.w    X3c(a0),d0
  726.         sub.w    X1c(a0),d0
  727.         move.w    d0,dX2(a0)        ;dX2=X3c-X1c
  728.         move.w    Y2c(a0),d0
  729.         sub.w    Y1c(a0),d0        
  730.         move.w    d0,dY1(a0)        ;dY1=Y2c-Y1c
  731.         move.w    Y3c(a0),d0
  732.         sub.w    Y1c(a0),d0
  733.         move.w    d0,dY2(a0)        ;dY2=Y3c-Y1c
  734.         move.w    Z2c(a0),d0
  735.         sub.w    Z1c(a0),d0
  736.         move.w    d0,dZ1(a0)        ;dZ1=Z2c-Z1c
  737.         move.w    Z3c(a0),d0
  738.         sub.w    Z1c(a0),d0
  739.         move.w    d0,dZ2(a0)        ;dZ2=Z3c-Z1c
  740.         muls.w    dY1(a0),d0        ;âåêòîð íîðìàëè
  741.         move.w    dZ1(a0),d3        ;êàê âåêòîðíîå ïðîèçâåäåíèå
  742.         muls.w    dY2(a0),d3
  743.         sub.w    d3,d0
  744.         move.w    d0,nX(a0)        ;nX=dZ2*dY1-dZ1*dY2
  745.         move.w    dZ1(a0),d1
  746.         muls.w    dX2(a0),d1
  747.         move.w    dX1(a0),d3
  748.         muls.w    dZ2(a0),d3
  749.         sub.w    d3,d1
  750.         move.w    d1,nY(a0)        ;nY=dZ1*dX2-dZ2*dX1
  751.         move.w    dX1(a0),d2
  752.         muls.w    dY2(a0),d2
  753.         move.w    dY1(a0),d3
  754.         muls.w    dX2(a0),d3
  755.         sub.w    d3,d2
  756.         move.w    d2,nZ(a0)        ;nZ=dX1*dY2-dX2*dY1
  757.         move.w    Z1c(a0),d3
  758.         add.w    #256,d3
  759.         muls.w    d3,d2
  760.         muls.w    Y1c(a0),d1
  761.         add.l    d2,d1
  762.         muls.w    X1c(a0),d0
  763.         add.l    d1,d0            ;(Z1+256)*nZ+Y1*nY+X1*nX<=0 ???
  764.         bgt    Triangle6        ;åñëè íåò, òî íåâèäèìûé
  765. TriangleWalls:
  766. ;(a0) - óêàçàòåëü íà îáëàñòü õðàíåíèÿ ïåðåìåííûõ
  767. ;(a2) - óêàçàòåëü íà ñòðóêòóðó ñ êîîðäèíàòàìè âåðøèí è êîäîì öâåòà
  768. ;Dist=256
  769.         move.l    d7,a3            ;ñîõðàíÿåì ðåãèñòðû
  770.         move.l    d6,a4
  771.  
  772.         move.w    #$ffff,d7        ;ïðåîáðàçîâàíèÿ 3D->2D
  773.         move.w    Z1c(a0),d6
  774.         add.w    #256,d6
  775.         move.w    X1c(a0),d1
  776.         and.l    d7,d1
  777.         ext.l    d1
  778.         lsl.l    #8,d1
  779.         divs.w    d6,d1
  780.         add.w    #160,d1            ;Sx1=160+256*X1c/(Z1c+256)
  781.         move.w    Y1c(a0),d0
  782.         and.l    d7,d0
  783.         ext.l    d0
  784.         lsl.l    #8,d0
  785.         divs.w    d6,d0
  786.         sub.w    #100,d0
  787.         neg.w    d0            ;Sy1=100-256*Y1c/(Z1c+256)
  788.         move.    Z2c(a0),d6
  789.         add.w    #256,d6
  790.         move.w    X2c(a0),d3
  791.         and.l    d7,d3
  792.         ext.l    d3
  793.         lsl.l    #8,d3
  794.         divs.w    d6,d3
  795.         add.w    #160,d3            ;Sx2=160+256*X2c/(Z2c+256)
  796.         move.w    Y2c(a0),d2
  797.         and.l    d7,d2
  798.         ext.l    d2
  799.         lsl.l    #8,d2
  800.         divs.w    d6,d2
  801.         sub.w    #100,d2
  802.         neg.w    d2            ;Sy2=100-256*Y2c/(Zc+256)
  803.         move.    Z3c(a0),d6
  804.         add.w    #256,d6
  805.         move.w    X3c(a0),d5
  806.         and.l    d7,d5
  807.         ext.l    d5
  808.         lsl.l    #8,d5
  809.         divs.w    d6,d5
  810.         add.w    #160,d5            ;Sx3=160+256*X3c/(Z3c+256)
  811.         move.w    Y3c(a0),d4
  812.         and.l    d7,d4
  813.         ext.l    d4
  814.         lsl.l    #8,d4
  815.         divs.w    d6,d4
  816.         sub.w    #100,d4
  817.         neg.w    d4            ;Sy3=100-256*Y3c/(Z3c+256)
  818.  
  819.         move.b    (a6),d6            ;îñâåùåííîñòü
  820. ;d0=Sy1,d1=Sx1
  821. ;d2=Sy2,d3=Sx2
  822. ;d4=Sy3,d5=Sx3
  823.         cmp.w    d0,d2            ;Ñîðòèðóåì ïî Y
  824.         bpl.s    Triangle0
  825.         exg.l    d0,d2
  826.         exg.l    d1,d3
  827. Triangle0:
  828.         cmp.w    d0,d4
  829.         bpl.s    Triangle1
  830.         exg.l    d0,d4
  831.         exg.l    d1,d5
  832. Triangle1:
  833.         cmp.w    d2,d4
  834.         bpl.s    Triangle2
  835.         exg.l    d4,d2
  836.         exg.l    d5,d3
  837. Triangle2:
  838.         move.w    d0,Sy1(a0)        ;Ñîõðàíÿåì ñ MinY ïî MaxY
  839.         move.w    d1,Sx1(a0)
  840.         move.w    d2,Sy2(a0)
  841.         move.w    d3,Sx2(a0)
  842.         move.w    d4,Sy3(a0)
  843.         move.w    d5,Sx3(a0)
  844.         cmp.w    d0,d4
  845.         beq    Triangle5
  846. Triangle3:                    ;Âåðõíÿÿ ÷àñòü òðåóãîëüíèêà
  847.         move.w    d0,d2            ;Áîëüøàÿ ñòîðîíà
  848.         sub.w    Sy1(a0),d2
  849.         move.w    d5,d3
  850.         sub.w    Sx1(a0),d3
  851.         muls.w    d3,d2
  852.         move.w    d4,d3
  853.         sub.w    Sy1(a0),d3
  854.         divs.w    d3,d2
  855.         add.w    Sx1(a0),d2
  856.  
  857.         move.w    d0,d1            ;Ìåíüøàÿ ñòîðîíà 1
  858.         sub.w    Sy1(a0),d1
  859.         move.w    Sx2(a0),d3
  860.         sub.w    Sx1(a0),d3
  861.         muls.w    d3,d1
  862.         move.w    Sy2(a0),d3
  863.         sub.w    Sy1(a0),d3
  864.         beq.s    Triangle4
  865.         divs.w    d3,d1
  866.         add.w    Sx1(a0),d1
  867.  
  868.         bsr    Line
  869.         addq.w    #1,d0
  870.         cmp.w    Sy2(a0),d0
  871.         bne.s    Triangle3
  872. Triangle4:                    ;Íèæíÿÿ ÷àñòü òðåóãîëüíèêà
  873.         move.w    d0,d2            ;Áîëüøàÿ ñòîðîíà
  874.         sub.w    Sy1(a0),d2
  875.         move.w    d5,d3
  876.         sub.w    Sx1(a0),d3
  877.         muls.w    d3,d2
  878.         move.w    d4,d3
  879.         sub.w    Sy1(a0),d3
  880.         divs.w    d3,d2
  881.         add.w    Sx1(a0),d2
  882.  
  883.         move.w    d0,d1            ;Ìåíüøàÿ ñòîðîíà 2
  884.         sub.w    Sy2(a0),d1
  885.         move.w    Sx3(a0),d3
  886.         sub.w    Sx2(a0),d3
  887.         muls.w    d3,d1
  888.         move.w    Sy3(a0),d3
  889.         sub.w    Sy2(a0),d3
  890.         beq.s    Triangle5
  891.         divs.w    d3,d1
  892.         add.w    Sx2(a0),d1
  893.  
  894.         bsr    Line
  895.         addq.w    #1,d0
  896.         cmp.w    Sy3(a0),d0
  897.         ble.s    Triangle4
  898. Triangle5:
  899.         move.l    a4,d6            ;âîññòàíàâëèâàåì ðåãèñòðû
  900.         move.l    a3,d7
  901. Triangle6:
  902.         rts
  903. Line:
  904. ;d1=X1, d2=X2
  905. ;d0=Y,d6=Colour
  906.         cmp.w    d1,d2
  907.         bpl.s    Line0
  908.         exg.l    d1,d2
  909. Line0:
  910.         lea    Buffer,a1
  911.         move.w    d0,d3
  912.         mulu.w    #320,d3
  913.         add.l    d3,a1
  914.         add.w    d1,a1
  915.         sub.w    d1,d2
  916. Line1:
  917.         move.b    d6,(a1)+
  918.         dbra    d2,Line1
  919.         rts
  920.  
  921.         GFXNAME
  922.         INTNAME
  923. DeviceName:    AUDIONAME
  924. AChanels:    dc.b    $f
  925.         even
  926. ScreenDefs:
  927.         dc.l    SA_Width,320
  928.         dc.l    SA_Height,200
  929.         dc.l    SA_Depth,8
  930.         dc.l    SA_DisplayID,0
  931.         dc.l    0,0
  932. WindowDefs:
  933. ;        dc.l    WA_Top,11
  934. ;        dc.l    WA_Height,189
  935.         dc.l    WA_Height,200
  936.         dc.l    WA_Width,320
  937.         dc.l    WA_Activate,1
  938.         dc.l    WA_IDCMP,8
  939.         dc.l    WA_CustomScreen
  940. ScreenHd:    dc.l    0
  941.         dc.l    0,0
  942. dX:        dc.w    0
  943. dY:        dc.w    0
  944. dZ:        dc.w    16
  945. ddX:        dc.w    1
  946. ddY:        dc.w    1
  947. ddZ:        dc.w    1
  948. Random:        dc.w    0
  949.  
  950. Data0:
  951.         incbin    SphereCoords
  952.  
  953. Data1:        dc.b    31,63,63,31,31,63,63,26,26,53,53,16,16,43
  954.         dc.b    63,31,31,63,63,31,31,58,58,21,21,48,48,11
  955.  
  956. Data2:
  957.         dc.w    -128,64,-32,-128,64,288,-128,-64,288
  958.         dc.w    -128,-64,-32,-128,64,-32,-128,-64,288
  959.         dc.w    -128,-64,-32,-128,-64,288,128,-64,288
  960.         dc.w    -128,-64,-32,128,-64,288,128,-64,-32
  961.         dc.w    -128,-64,288,-128,64,288,128,64,288
  962.         dc.w    -128,-64,288,128,64,288,128,-64,288
  963.         dc.w    128,-64,-32,128,-64,288,128,64,288
  964.         dc.w    128,-64,-32,128,64,288,128,64,-32
  965. Data3:
  966.         dc.b    64,64,128,128,96,96,224,224
  967. GfxData:
  968.         dc.l    %00000000001111100111111000000000
  969.         dc.l    %00000000011001100110011000000000
  970.         dc.l    %00000000011001100011000000000000
  971.         dc.l    %00000000011001100011100000000000
  972.         dc.l    %00000000011001100110000000000000
  973.         dc.l    %00000000011001100110011000000000
  974.         dc.l    %00000000001111100011110000000000
  975.         dc.l    %00000000000000000000000000000000
  976.         dc.l    %00000000000000000000000000000000
  977.         dc.l    %00000000000000011000000000111110
  978.         dc.l    %00000000000000000000000001100110
  979.         dc.l    %01111100011111011001111001100110
  980.         dc.l    %01100110110011011011001100111110
  981.         dc.l    %01100110110011011011001101100110
  982.         dc.l    %01100110110011011011001101100110
  983.         dc.l    %01111100110011011001111000111110
  984.         dc.l    %01100000000000000000000000000000
  985.         dc.l    %00111100000000000000000000000000
  986.  
  987. SinCosBegin:    dc.w    $8000,$8000
  988. SinCosTable:    incbin    "SinCosTable"        ;Sin(alfa)*32767,Cos(alfa)*32767
  989. SinCosEnd:    dc.w    $8000
  990.  
  991. SinCosOffset:
  992.         dc.w    4
  993.  
  994.         section    MousePointer,DATA_C
  995. PointerData:    dc.w    0,0,0,0,0,0
  996. Sample:        incbin    "boom"            ;698
  997. Sample0:
  998. SLength:    =    Sample0-Sample
  999.  
  1000.         section    data,BSS
  1001. Buffer:        ds.b    320*200
  1002. Plasma:        ds.b    320*200
  1003. GfxBase:    ds.l    1
  1004. IntBase:    ds.l    1
  1005. WindowHd:    ds.l    1
  1006. RstPort:    ds.l    1
  1007. MsgPort:        ds.l    1
  1008. IORequest:      ds.l    1
  1009. OldIntVector:    ds.l    1
  1010. MyVars:        ds.b    1024
  1011. MyPalette:    ds.b    3080
  1012. Coords:        ds.l    (224+TriangleNumber)*9
  1013. Colours:    ds.b    224+TriangleNumber
  1014.